package com.fruitshop.info.manager.controller;

import com.fruitshop.info.manager.domain.Fruit;
import com.fruitshop.info.manager.service.FruitService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 1.水果的业务员类,加入了日志功能用以显示客户的购买记录
 * 2.加入了两个提示方法tip(),用于在管理员进行进行增加和修改操作时如果输入的信息不存在可以进行对应的其他操作
 * 3.此类中单独设计了一个int数组,用以记录客户的购买数量,方便用于计算客户的购买金额,以及后续修改本地文件中的库存信息
 */
@SuppressWarnings("all")
public class FruitController {

    private static final Logger LOGGER = LoggerFactory.getLogger(FruitController.class);

    Scanner sc = new Scanner(System.in);
    FruitService service = new FruitService();
    ArrayList<Fruit> list = service.findAllFruits();
    int[] arr = new int[list.size()];
    String markNum;


    public void start() {
        loop:
        while (true) {
            System.out.println("请输入您的选择:(1.查看水果   2.添加水果   3.修改水果   4.删除水果   5.退出)");
            String choice = sc.next();
            switch (choice) {
                case "1":
                    service.managerCheck();
                    break;
                case "2":
                    add();
                    break;
                case "3":
                    update();
                    break;
                case "4":
                    delete();
                    break;
                case "5":
                    System.out.println("感谢您的使用~");
                    break loop;
                default:
                    break;
            }
        }
    }

    public void update() {
        System.out.println("请输入要修改的水果编号:");
        String num = sc.next();
        boolean res = service.isExist(num);
        if (res) {
            System.out.println("请输入要修改的水果名称:");
            String name = sc.next();
            System.out.println("请输入要修改的水果单价:");
            int price = sc.nextInt();
            System.out.println("请输入要修改的水果库存:");
            int inventory = sc.nextInt();
            System.out.println("请输入要修改的水果单位:");
            String unit = sc.next();
            Fruit newFruit = new Fruit(num, name, price, inventory, unit);
            System.out.println("修改成功!");
            System.out.println("修改后的信息如下:");
            System.out.println("编号" + "\t\t\t" + "名称" + "\t\t" + "价格" + "\t\t" + "库存" + "\t\t" + "单位");
            System.out.println(num + "\t\t" + name + "\t\t" + price + "\t\t\t" + inventory + "\t\t\t" + unit);
            service.update(num, newFruit);
        } else {
            tips1();
        }
    }

    public void tips1() {
        System.out.println("您输入的编号不存在,修改失败!<温馨提示:是否需要添加新品?>");
        while (true) {
            System.out.println("Yes-->继续添加请按<1>         No-->返回上级菜单请按<0>");
            int choice = sc.nextInt();
            if (choice == 1) {
                add();
                break;
            } else if (choice == 0) {
                return;
            } else {
                System.out.println("您输入的信息有误,请按提示进行操作!");
            }
        }
    }

    public void delete() {
        System.out.println("请输入要删除的水果编号:");
        String num = sc.next();
        boolean res = service.isExist(num);
        if (res) {
            service.delete(num);
            System.out.println("删除成功!");
        } else {
            System.out.println("您输入的编号不存在,删除失败.请重新您的选择!");
        }
    }

    public void add() {
        System.out.println("请输入要添加的水果编号:");
        String num = sc.next();
        boolean res = service.isExist(num);
        if (!res) {
            System.out.println("请输入要添加的水果名称:");
            String name = sc.next();
            System.out.println("请输入要添加的水果单价:");
            int price = sc.nextInt();
            System.out.println("请输入要修改的水果库存:");
            int inventory = sc.nextInt();
            System.out.println("请输入要添加的水果单位:");
            String unit = sc.next();
            service.add(num, name, price, inventory, unit);
            System.out.println("添加成功!");
        } else {
            tips2();
        }
    }
    //提示2
    public void tips2() {
        System.out.println("不好意思,您输入的水果编号已经存在了!<温馨提示:是否需要修改已有的商品?>");
        while (true) {
            System.out.println("Yes-->操作修改请按<1>                     No-->返回上级菜单请按<0>");
            int choice = sc.nextInt();
            if (choice == 1) {
                update();
                break;
            } else if (choice == 0) {
                return;
            } else {
                System.out.println("您输入的信息有误,请按提示进行操作!");
            }
        }
    }

    public void open() {
        //循环标号
        looop:
        while (true) {
            System.out.println("请输入您的选择:(1.查看水果   2.开始购买   3.结账   4.退出)");
            String choice = sc.next();
            switch (choice) {
                case "1":
                    check();
                    break;
                case "2":
                    //此处是为了记录客户查看的记录方便客户购买时已客户喜好的顺序展示数据
                    if ("1".equals(markNum)) {
                        //使用了一个标记变量,用以记录客户的排序选择
                        service.checkByPrice();//已价格排序
                    } else {
                        service.check();//默认已库存排序
                    }
                    buy();
                    break;
                case "3":
                    count();
                    break;
                case "4":
                    System.out.println("欢迎您下次光临~");
                    break looop;//跳出循环
                default:
                    break;
            }
        }
    }

    public void check() {
        service.check();
        System.out.println("当前系统默认以库存降序显示   您也可以选择以价格进行排序哦~");
        System.out.println("如需切换请按<1>                    返回上级菜单请按<0>");
        markNum = sc.next();
        switch (markNum) {
            case "1":
                service.checkByPrice();
                return;
            case "0":
                return;
            default:
                System.err.println("您的输入有误,请按提示操作~");
                break;
        }
    }

    public void buy() {
        System.out.println("本店开业大酬宾,多买多优惠哦~");
        System.out.println("优惠规则如下:1.消费金额100元以内无优惠");
        System.out.println("            2.消费金额200元以内超出100的可以享受9折优惠");
        System.out.println("            3.消费金额500元以内超出100的不超出200的部分9折优惠,超出200低于500以内的8折优惠");
        System.out.println("            4.消费金额500以上的,500元以内优惠力度如上,500元以外的金额7折优惠");

        while (true) {
            System.out.println("请选择您要购买的水果(请输入对应的水果编号):");
            String fruitNum = sc.next();
            //调用服务员对象判断客户输入的编号是否存在
            boolean exist = service.isExist(fruitNum);
            for (int i = 0; i < list.size(); i++) {
                if (!exist) {
                    System.err.println("您输入的编号不存在!请核对信息后重新输入~");
                    break;
                }
                System.out.println("请输入您要购买的数量(斤):");
                int num = sc.nextInt();
                //指挥业务员对象中已编号获取索引的方法
                int index = service.getIndex(fruitNum);
                //判断客户选择的水果是否还有库存
                if (list.get(index).getInventory() > num) {
                    //此处设计了一个int类型的数组用以记录客户的购买数量,数组长度等于水果的集合长度
                    arr[index] = num;//让int数组记录购买数量,索引保持与集合中的索引位置一致
                    service.inventory(fruitNum, num, arr);//调用库存方法,传入编号,金额,与记录了金额的int数组
                    System.out.println("继续添加请按<1>           提交订单请按<0>");
                    int choic = sc.nextInt();
                    if (choic == 0) {
                        count();
                        return;
                    } else if (choic == 1) {
                        break;
                    }
                } else {
                    System.err.println("抱歉,库存不足,您可继续挑选其它商品~");
                    System.out.println("继续添加请按<1>                    返回上级菜单请按<0>");
                    int choic = sc.nextInt();
                    if (choic == 1) {
                        break;
                    } else if (choic == 0) {
                        return;
                    }
                }
            }
        }
    }


    public void count() {
        //设计了一个变量用于计算总金额
        int count = 0;
        for (int i = 0; i < list.size(); i++) {
            //遍历集合拿到每个水果对象的名字以及客户用户的购买金额,调用服务员对象计算
            count += service.count(list.get(i).getName(), arr[i]);//累加求和得到客户订单的总金额
            LOGGER.info("客户购买了:" + list.get(i).getName() + "," + "购买数:" + arr[i]);//日志记录了每一种水果的购买记录
        }
        System.out.print("您购买的水果原始总金额是:" + count + "元.");
        if (count <= 100) {
            System.out.println("您购买的水果原始总金额是:" + count + "元.");
        } else if (count > 100 && count <= 200) {
            count = (int) (100 + (count - 100) * 0.9);
            System.out.println("优惠之后的总金额是:" + count + "元");
        } else if (count <= 500) {
            count = (int) (200 * 0.9 + (count - 200) * 0.8);
            System.out.println("优惠之后的总金额是:" + count + "元");
        } else if (count > 500) {
            count = (int) ((200 * 0.9 + 300 * 0.8) + (count - 500) * 0.7);
            System.out.println("优惠之后的总金额是:" + count + "元");
        }
    }


}
